package pe.com.bbva.carga.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import oracle.jdbc.OracleTypes;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.bbva.carga.dao.LoadClassTargpsDAO;
import pe.com.bbva.carga.domain.ArchivoCarga;
import pe.com.bbva.carga.domain.Proceso;
import pe.com.stefanini.core.dao.GenericDAOImpl;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.FechaUtil;
import pe.com.stefanini.core.util.StringUtil;

@Service("loadClassTargpsDAO")
@SuppressWarnings({"rawtypes", "deprecation"})
public class LoadClassTargpsDAOImpl extends GenericDAOImpl implements LoadClassTargpsDAO {
	Logger logger = Logger.getLogger(this.getClass());
	
	@Autowired
	public LoadClassTargpsDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
			
	public List<Proceso> findFechaProcesoPendiente(Long idConfiguracion) throws DAOException{
		logger.info("INICIO findFechaProcesoPendiente");
		Session hibernateSession = null;
		Connection con = null;
		CallableStatement cstmt = null;
		ResultSet rs = null;
		Proceso proceso=null;
		List<Proceso> lista = new ArrayList<Proceso>();
		try {
			hibernateSession = (Session) getHibernateTemplate().getSessionFactory().openSession();
			con = hibernateSession.connection();
			cstmt = con.prepareCall("{call TARGPS.TARGPSPKG.PR_TARGPS_OBTENER_FECHAPROCESO(?,?)}");
			cstmt.setLong(1, idConfiguracion);
			cstmt.registerOutParameter(2,OracleTypes.CURSOR);
			cstmt.executeQuery();			
			rs = (ResultSet) cstmt.getObject(2);				
			while (rs.next()) {
				proceso=new Proceso();
				proceso.setId(rs.getLong("ID_PROCESO"));
				proceso.setFechaProceso(rs.getString("FECHAPROCESO"));
			lista.add(proceso);		      
		    }    
		
		} catch (HibernateException e) {
			logger.info(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			logger.info(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			logger.info(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (cstmt != null) {
					cstmt.close();
				}
				hibernateSession.close();
			} catch (SQLException e) {
				logger.info(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			} catch (HibernateException e) {
				logger.info(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			}
		}
		logger.info("FIN findFechaProcesoPendiente");
		return lista;		
	}
	
	public String cargarArchivo(ArchivoCarga archivoCarga) throws DAOException{
		Session hSesion = null;
		Connection con = null;
		CallableStatement cstmt =null;
		String strMensaje=null;
		try {
			logger.info("INICIANDO JOB TARGPS");
			logger.info("ejecutando sp: call TARGPS.PKG_TARGPS.PR_PROCESAR_ARCHIVO ");
			logger.info("cargaArchivo.getId(): "+archivoCarga.getId());
			logger.info("fechaProceso: "+archivoCarga.getFechaProceso());
			logger.info("cargaArchivo.getNombreArchivo(): "+archivoCarga.getNombreArchivo());
			hSesion =getHibernateTemplate().getSessionFactory().openSession();
			con = hSesion.connection();
			cstmt =con.prepareCall("{call TARGPS.TARGPSPKG.PR_TARGPS_PROCESAR_ARCHIVO(?,?,?,?,?,?,?,?)}");
			cstmt.setLong(1,archivoCarga.getIdProceso());
			cstmt.setLong(2,archivoCarga.getIdEquipo());
			cstmt.setLong(3,archivoCarga.getIdTipoArchivo());
			cstmt.setString(4,FechaUtil.formatFecha(archivoCarga.getFechaProceso(),"dd/MM/yyyy"));
			cstmt.setString(5,archivoCarga.getNombreArchivo());						
			cstmt.setString(6,archivoCarga.getIdTurno().toString());
			cstmt.registerOutParameter(7, OracleTypes.INTEGER );
			cstmt.registerOutParameter(8, OracleTypes.VARCHAR );
			cstmt.executeQuery();
			Integer intRetorno = cstmt.getInt(7);
			strMensaje=cstmt.getString(8)==null?"":cstmt.getString(8);
			logger.info("resultado de PR_TARGPS_PROCESAR_CLASTARGPS::OUT_RETORNO: "+intRetorno);
			logger.info("resultado de PR_TARGPS_PROCESAR_CLASTARGPS::OUT_MENSAJE: "+strMensaje);
			logger.info("FINALIZANDO JOB TARGPS");
		} catch (HibernateException e) {
			logger.error(e.getMessage(), e);
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			logger.error(e.getMessage(), e);
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			throw new DAOException(e.getMessage());
		}finally{
			try {
				if(cstmt!=null) cstmt.close();
				if(con!=null)   con.close();
				hSesion.close();
			} catch (SQLException e) {
				logger.error(e.getMessage(), e);
				throw new DAOException(e.getMessage());
			} catch (HibernateException e) {
				logger.error(e.getMessage(), e);
				throw new DAOException(e.getMessage());
			} 
		}
		return strMensaje;
	}
}